﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;
using Zzva.DomainObject;
using Zzva.ESB;
using Zzva.Common;


namespace Zzva.DomainObjectReg
{
    public class TRegDirSoftware : TRegDirBase
    {

        private static TRegDirSoftware mvarRegDirSoftware;


        public void Delete()
        {
            try
            {
                TDirBase lCurDir;
                Collection<TDirBase> lCurListDir;
                int lIdAfterDelete;

                lCurListDir = GetCurList();
                lCurDir = GetCurItem();

                lIdAfterDelete = GetIdAfterDelete(lCurDir, lCurListDir);

                if (lIdAfterDelete == -1) { throw (new CommonException("Нет текущего элемента в коллекции")); }

                TDirSoftwareBase lDirSoftwareBase = (TDirSoftwareBase)lCurDir;
                Esb.DeleteSoftware(ref lDirSoftwareBase);
                TDirSoftwareNull lDirSoftwareNull = (TDirSoftwareNull)lDirSoftwareBase;

                ////Collection<TDirSoftware> lListDir = Esb.GetListSoftware();
                Collection<TDirSoftware> lListDir = Esb.GetListSoftware(0);


                Collection<TDirBase> lListDirBase = new Collection<TDirBase>();
                foreach (TDirSoftware h in lListDir) { lListDirBase.Add((TDirBase)h); }

                TDirBase lCurItem;
                if (lIdAfterDelete > 0) { lCurItem = GetItemById(lIdAfterDelete, lListDirBase); }
                else if (lIdAfterDelete == 0) { lCurItem = null; }
                else if (lIdAfterDelete == -1) { throw (new CommonException("Нет текущего элемента в коллекции")); }
                else { throw (new CommonException("Нет значения возврата для GetIdAfterDelete")); }

                mvarFullListDir = lListDirBase;
                mvarCurItem = lCurItem;

                ////
                mvarFlgSinhroCurListAndCurState = false;

                //дальше здесь событие что обновлено
                FireEventUpdateList(EventArgs.Empty);
            }
            catch (Exception e1) { throw e1; }
            finally { }
        }

        //Редактирует текущую элемент справочника, на вход объект TDirITCompanyNew  с новыми знвчениями текщей записи
        public void Edit(TDirSoftwareNew pDir)
        {
            try
            {
                TDirSoftware lCurDir;


                //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                //Тут бы желательно открыть транзакцию

                lCurDir = (TDirSoftware)this.GetCurItem();
                lCurDir.Obozn = pDir.Obozn;
                lCurDir.Naim = pDir.Naim;
                lCurDir.Developer = pDir.Developer;
                lCurDir.Holder = pDir.Holder;

                ////
                lCurDir.SoftType = pDir.SoftType;





                TDirSoftwareBase lDirSoftwareBase = (TDirSoftwareBase)lCurDir;

                ////Esb.SaveSoftware(ref lDirSoftwareBase);
                Esb.SaveSoftware(ref lDirSoftwareBase, 0);

                TDirSoftware lDirSoftware = (TDirSoftware)lDirSoftwareBase;

                ////Collection<TDirSoftware> lListDir = Esb.GetListSoftware();
                Collection<TDirSoftware> lListDir = Esb.GetListSoftware(0);

                Collection<TDirBase> lListDirBase = new Collection<TDirBase>();
                foreach (TDirSoftware h in lListDir)
                {
                    lListDirBase.Add((TDirBase)h);
                }

                TDirBase lCurItem;
                lCurItem = GetItemById(lDirSoftware.Id, lListDirBase);

                mvarFullListDir = lListDirBase;
                mvarCurItem = lCurItem;

                ////
                mvarFlgSinhroCurListAndCurState = false;


                //дальше здесь событие что обновлено
                FireEventUpdateList(EventArgs.Empty);
            }
            catch (Exception e1) { throw e1; }
            finally { }
        }


        //Добавляет элемент справочника и делает его текущим
        public void Add(TDirSoftwareNew pDir)
        {
            try
            {
                TDirSoftwareBase lDirSoftwareBase = (TDirSoftwareBase)pDir;

                //Esb.SaveSoftware(ref lDirSoftwareBase);
                Esb.SaveSoftware(ref lDirSoftwareBase, 0);

                TDirSoftware lDirSoftware = (TDirSoftware)lDirSoftwareBase;

                //Collection<TDirSoftware> lListDir = Esb.GetListSoftware();
                Collection<TDirSoftware> lListDir = Esb.GetListSoftware(0);

                Collection<TDirBase> lListDirBase = new Collection<TDirBase>();
                foreach (TDirSoftware h in lListDir)
                {
                    lListDirBase.Add((TDirBase)h);
                }


                TDirBase lCurItem;
                lCurItem = GetItemById(lDirSoftware.Id, lListDirBase);

                mvarFullListDir = lListDirBase;
                mvarCurItem = lCurItem;


                ////
                mvarFlgSinhroCurListAndCurState = false;


                //дальше здесь событие что обновлено
                FireEventUpdateList(EventArgs.Empty);

            }

            catch (Exception e1) { throw e1; }
            finally { }
        }




















































































        protected override Collection<TAliasForField> GetListOboznAndAlias()
        {

            Collection<TAliasForField> lList;

            lList = base.GetListOboznAndAlias();

            lList.Add(new TAliasForField("Developer", "Разработчик"));
            lList.Add(new TAliasForField("Holder", "Правообладатель"));


            ////
            lList.Add(new TAliasForField("SoftType", "Категория"));



            return lList;
        }

        //Возвращает единственный экземпляр Контроллера себя любимого
        public static TRegDirSoftware GetObject()
        {
            try
            {

                //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                //Убираем сингелетон до вяснения причин сбоя при повторном открытии
                //if (mvarRegDirSoftware == null)
                //{
                Collection<TDirSoftware> lListSoftware;

                ////lListSoftware = TEsb.GetEsb().GetListSoftware();
                lListSoftware = TEsb.GetEsb().GetListSoftware(0);



                Collection<TDirBase> lListDirBase = new Collection<TDirBase>();
                foreach (TDirSoftware h in lListSoftware) { lListDirBase.Add((TDirBase)h); }

                mvarRegDirSoftware = new TRegDirSoftware(lListDirBase);
                //}
                return mvarRegDirSoftware;
            }
            catch (Exception e) { throw e; }
            finally { }
        }


        //Возвращает представление для клиента
        public override object GetCurListView()
        {
            try
            {
                Collection<TDirBase> lCurrentList = GetCurList();

                var hhh = lCurrentList.Select
                (p =>
                {
                    TDirSoftware d = (TDirSoftware)p;
                    var k = new
                    {
                        Id = d.Id,
                        Обозначение = d.Obozn,
                        Наименование = d.Naim,

                        //Разработчик = d.Developer.Obozn,
                        Разработчик = d.Developer,

                        ////
                        Категория = d.SoftType,


                        //Правообладатель = d.Holder.Obozn,
                        Правообладатель = d.Holder,

                    };
                    return k;
                }
                );

                hhh = hhh.ToList();
                return hhh;
            }
            catch (Exception e1) { throw e1; }
            finally { }
        }



////        //Ищет в заданном списке элемент справочника в заданном поле по заданному шаблону
////        protected override TDirBase FindLastDirInList
////            (string pFieldObozn, string pFieldTemplate, IEnumerable<TDirBase> pList)
////        {
////            try
////            {
////                TDirBase lDirBase;
////
////                lDirBase = base.FindLastDirInList(pFieldObozn, pFieldTemplate, pList);
////
////                //готовим делегата условия
////                Func<TDirBase, bool> lPredicate;
////                lPredicate = null;
////                switch (pFieldObozn)
////                {
////                    case "Developer":
////                        lPredicate = d => ((TDirSoftware)d).Developer.Obozn.ToLower().Contains(pFieldTemplate.ToLower());
////                        lDirBase = pList.LastOrDefault(lPredicate);
////                        break;
////                    case "Holder":
////                        lPredicate = d => ((TDirSoftware)d).Holder.Obozn.ToLower().Contains(pFieldTemplate.ToLower());
////                        lDirBase = pList.LastOrDefault(lPredicate);
////                        break;
////                    default:
////                        break;
////                }
////                return lDirBase;
////            }
////            catch (Exception e1) { throw e1; }
////            finally { }
////        }



////        //Ищет в заданном списке элемент справочника в заданном поле по заданному шаблону
////        protected override TDirBase FindFirstDirInList
////            (string pFieldObozn, string pFieldTemplate, IEnumerable<TDirBase> pList)
////        {
////            try
////            {
////                TDirBase lDirBase;
////
////                lDirBase = base.FindFirstDirInList(pFieldObozn, pFieldTemplate, pList);
////
////                //готовим делегата условия
////                Func<TDirBase, bool> lPredicate;
////                lPredicate = null;
////                switch (pFieldObozn)
////                {
////                    case "Developer":
////                        ////lPredicate = d => d.Obozn.ToLower().Contains(pFieldTemplate.ToLower());
////                        lPredicate = d => ((TDirSoftware)d).Developer.Obozn.ToLower().Contains(pFieldTemplate.ToLower());
////                        lDirBase = pList.FirstOrDefault(lPredicate);
////                        break;
////                    case "Holder":
////                        ////lPredicate = d => d.Naim.ToLower().Contains(pFieldTemplate.ToLower());
////                        lPredicate = d => ((TDirSoftware)d).Holder.Obozn.ToLower().Contains(pFieldTemplate.ToLower());
////                        lDirBase = pList.FirstOrDefault(lPredicate);
////                        break;
////                    default:
////                        break;
////                }
////
////                return lDirBase;
////            }
////
////            catch (Exception e1) { throw e1; }
////            finally { }
////        }



////        //Фильтруе заданный список по установленному фильтру
////        protected override IEnumerable<TDirBase> SelectListBySetFilter(IEnumerable<TDirBase> pList)
////        {
////            try
////            {
////                //Фильт по базовым полям
////                pList = base.SelectListBySetFilter(pList);
////
////                //готовим делегата условия
////                Func<TDirBase, bool> lPredicate;
////                lPredicate = null;
////
////                if (mvarListFilter.Count != 0) //Есть фильтр
////                {
////                    foreach (TFilterValue k in mvarListFilter)
////                    {
////                        switch (k.FieldObozn)
////                        {
////                            case "Developer":
////                                //lPredicate = d => d.Obozn.ToLower().Contains(k.FilterTemplate.ToLower());
////                                lPredicate = d => ((TDirSoftware)d).Developer.Obozn.ToLower().Contains(k.FilterTemplate.ToLower());
////
////                                //pList = pList.Where(lPredicate);
////                                pList = pList.Where(lPredicate).ToList();
////
////                                break;
////                            case "Holder":
////                                lPredicate = d => ((TDirSoftware)d).Holder.Obozn.ToLower().Contains(k.FilterTemplate.ToLower());
////
////                                //pList = pList.Where(lPredicate);
////                                pList = pList.Where(lPredicate).ToList();
////
////                                break;
////                            default:
////                                break;
////                            //throw (new CommonException("Нет такого поля"));
////                        }
////                        //pList = pList.Where(lPredicate);
////                    }
////                }
////                return pList;
////            }
////            catch (Exception e1) { throw e1; }
////            finally { }
////        }

































































































































































































































        //Возвращает Шаблон нового объекта
        public TDirBase GetTemplateNewItem()
        {
            try
            {
                TDirSoftwareNew lDirSoftwareNew;
                string lNewOboznSoftware;

                lNewOboznSoftware = GetNewOboznSoftware();

                lDirSoftwareNew = new TDirSoftwareNew();
                lDirSoftwareNew.Obozn = lNewOboznSoftware;

                return (TDirBase)lDirSoftwareNew; 

            }

            catch (Exception e1) { throw e1; }
            finally { }
        }


        //Вернуть внутренний код для нового объекта Software
        private string GetNewOboznSoftware()
        {
            try
            {

                int lLastIdSoftware;
                string lTemplateOboznSoftware;
                string lNewOboznSoftware;

                //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                //Здесь достаем шаблон из установок, а пока так
                lTemplateOboznSoftware = "ВЛИЕ.2/38-7-1";


                lLastIdSoftware = Esb.GetLastIdSoftware();
                lLastIdSoftware = lLastIdSoftware + 1;

                string lLastIdSoftwareString;
                string lDeltaObozn;
                lLastIdSoftwareString = lLastIdSoftware.ToString();
                switch (lLastIdSoftwareString.Length)
                {
                    case 1:
                        lDeltaObozn = "00" + lLastIdSoftwareString; 
                        break;
                    case 2:
                        lDeltaObozn = "0" + lLastIdSoftwareString;
                        break;
                    case 3:
                        lDeltaObozn = lLastIdSoftwareString;
                        break;
                    default:
                        throw (new CommonException("Перебор знаков в коде ПО"));
                        ////break;
                }



                lNewOboznSoftware = lTemplateOboznSoftware + lDeltaObozn;


                return lNewOboznSoftware;
            }

            catch (Exception e1) { throw e1; }
            finally { }
        }








        #region (Конструктор, Singeleton)...






        protected TRegDirSoftware(Collection<TDirBase> pFullListDir)
            : base(pFullListDir)
        {
            try { }
            catch (Exception e) { throw e; }
            finally { }
        }



        #endregion



        public override string Title
        {get{return "Справочник. Программное обеспечение";}}


    }
}
